#添加cmake版本说明
cmake_minimum_required(VERSION 3.22.1)
#声明工程名称
project(user_server)

set(target "user_server")

#生成user文件
#   1. 添加所需的user映射代码文件名称
#CMAKE_CURRENT_SOURCE_DIR cmake 文件所在目录
set(proto_path ${CMAKE_CURRENT_SOURCE_DIR}/../proto)
set(proto_files user.proto base.proto file.proto)
#   2. 检测框架代码文件是否已经生成
set(proto_cc "")
set(proto_hh "")
set(proto_srcs "")

foreach(proto_file ${proto_files})
   #   3. 如果没有生成，则预定义生成指令 -- 用于在构建项目之间先生成框架代码
   string(REPLACE ".proto" ".pb.cc" proto_cc ${proto_file}) 
   string(REPLACE ".proto" ".pb.h" proto_hh ${proto_file})
   if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc} OR NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${proto_hh})
    add_custom_command(
        PRE_BUILD #表示在所有其他步骤之前执行自定义命令
        COMMAND protoc#要执行的指令名称
        ARGS --cpp_out=${CMAKE_CURRENT_BINARY_DIR} -I ${proto_path} --experimental_allow_proto3_optional ${proto_path}/${proto_file} #要执行的指令运行参数选项
        DEPENDS ${proto_path}/${proto_file}#指定命令的依赖项
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc}#指定要生成的目标名称
        COMMENT "生成proto框架代码文件:" ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc}#执行命令时要打印的内容
    )
   endif()
   #   
   list(APPEND proto_srcs ${CMAKE_CURRENT_BINARY_DIR}/${proto_cc})
endforeach()

set(odb_path ${CMAKE_CURRENT_SOURCE_DIR}/../odb)
set(odb_files user.hxx)
#   2. 检测框架代码文件是否已经生成
set(odb_hxx "")
set(odb_cxx "")
set(odb_srcs "")

foreach(odb_file ${odb_files})
   #   3. 如果没有生成，则预定义生成指令 -- 用于在构建项目之间先生成框架代码
   string(REPLACE ".hxx" "-odb.hxx" odb_hxx ${odb_file}) 
   string(REPLACE ".hxx" "-odb.cxx" odb_cxx ${odb_file})
   if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${odb_hxx} OR NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
    add_custom_command(
        PRE_BUILD #表示在所有其他步骤之前执行自定义命令
        COMMAND odb#要执行的指令名称
        ARGS -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file} #要执行的指令运行参数选项
        DEPENDS ${odb_path}/${odb_file}#指定命令的依赖项
        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}#指定要生成的目标名称
        COMMENT "生成ODB框架代码文件:" ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx}#执行命令时要打印的内容
    )
   endif()
   #   4. 将所有生成的框架源码文件名称保存起来 student-odb.cxx classes-odb.cxx
   list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})
endforeach()
# 5. 获取源码目录下的所有源码文件
set(src_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)
# 6. 声明目标及依赖
add_executable(${target} ${src_files} ${proto_srcs} ${odb_srcs})

# 8. 设置需要连接的库
target_link_libraries(${target} -lgflags -lspdlog -lfmt -lbrpc -lssl -lcrypto -lprotobuf
-lleveldb -letcd-cpp-api -lcpprest -lcurl /usr/lib/x86_64-linux-gnu/libjsoncpp.so.19
-lalibabacloud-sdk-core -lcpr -lelasticlient
-lhiredis -lredis++
-lodb-mysql -lodb -lodb-boost)

set(test_client "user_client")
set(test_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/test test_files)
add_executable(${test_client} ${test_files} ${proto_srcs} )
target_link_libraries(${test_client} -lgtest -lgflags -lspdlog -lfmt -lbrpc -lssl -lprotobuf -lleveldb -letcd-cpp-api -lcpprest -lcurl -lcrypto /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.8.4)

# 7. 设置头文件默认搜索路径
include_directories(${CMAKE_CURRENT_BINARY_DIR})
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../odb)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../common)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../third)

# 9. 设置安装路径
INSTALL(TARGETS ${target} ${test_client} RUNTIME DESTINATION bin)

